package org.lemon.cla.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 受保护的资源控制器示例
 */
@RestController
@RequestMapping("/api/resource")
@Tag(name = "调试演示接口", description = "用于演示Spring Security基于角色的访问控制和认证状态")
public class ResourceController {

    /**
     * 只有认证用户才能访问的接口
     */
    @Operation(summary = "获取学生敏感数据", description = "只有拥有 'ROLE_学生' 角色的已认证用户才能访问此接口。")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "成功获取学生数据",
                    content = @Content(mediaType = "text/plain", schema = @Schema(type = "string", example = "这是用户的敏感数据，只有 ROLE_学生 才能访问。"))),
            @ApiResponse(responseCode = "401", description = "未认证或Token无效"),
            @ApiResponse(responseCode = "403", description = "权限不足，当前用户没有'ROLE_学生'角色")
    })
    @GetMapping("/student-data") // Changed to student-data for clarity as per role
    @PreAuthorize("hasRole('学生')") // 只有拥有 'ROLE_学生' 角色的用户才能访问
    public ResponseEntity<String> getUserData() {
        return ResponseEntity.ok("这是用户的敏感数据，只有 ROLE_学生 才能访问。");
    }

    /**
     * 只有管理员才能访问的接口
     */
    @Operation(summary = "获取管理员敏感数据", description = "只有拥有 'ROLE_管理员' 角色的已认证用户才能访问此接口。")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "成功获取管理员数据",
                    content = @Content(mediaType = "text/plain", schema = @Schema(type = "string", example = "这是管理员的敏感数据，只有 ROLE_管理员 才能访问。"))),
            @ApiResponse(responseCode = "401", description = "未认证或Token无效"),
            @ApiResponse(responseCode = "403", description = "权限不足，当前用户没有'ROLE_管理员'角色")
    })
    @GetMapping("/admin-data")
    @PreAuthorize("hasRole('管理员')") // 只有拥有 'ROLE_管理员' 角色的用户才能访问
    public ResponseEntity<String> getAdminData() {
        return ResponseEntity.ok("这是管理员的敏感数据，只有 ROLE_管理员 才能访问。");
    }

    /**
     * 所有认证用户都能访问的接口
     */
    @Operation(summary = "获取所有认证用户数据", description = "任何已认证（已登录）的用户，无论其角色如何，都能访问此接口。")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "成功获取公共认证数据",
                    content = @Content(mediaType = "text/plain", schema = @Schema(type = "string", example = "这是所有认证用户都能访问的数据。"))),
            @ApiResponse(responseCode = "401", description = "未认证或Token无效")
    })
    @GetMapping("/authenticated-data") // Changed to authenticated-data for clarity
    @PreAuthorize("isAuthenticated()") // 只要是认证用户（无论角色）都能访问
    public ResponseEntity<String> getPublicData() {
        return ResponseEntity.ok("这是所有认证用户都能访问的数据。");
    }

    /**
     * 无需认证即可访问的接口
     */
    @Operation(summary = "获取匿名公共数据", description = "此接口无需任何认证即可访问，对所有用户开放。")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "成功获取匿名公共数据",
                    content = @Content(mediaType = "text/plain", schema = @Schema(type = "string", example = "这是无需认证即可访问的公共数据。")))
    })
    @GetMapping("/anonymous-data")
    public ResponseEntity<String> getAnonymousData() {
        return ResponseEntity.ok("这是无需认证即可访问的公共数据。");
    }
}